module Ascon_p(
    input clk,
    input rst,
    input [4:0]rnd,
    input [319:0]Sin,
    output [319:0]Sout,
    output done
    );

reg [7:0]permu_const;
reg [319:0]permu_Sin;
wire [319:0]permu_Sout;
permutation permu(.const(permu_const),.Sin(permu_Sin),.Sout(permu_Sout));

reg [5:0]next;
reg [5:0]now;
reg [4:0]i;
localparam [127:0] const = {
    8'h3c,  // C0（索引0）
    8'h2d,  // C1（索引1）
    8'h1e,  // C2（索引2）
    8'h0f,  // C3（索引3）
    8'hf0,  // C4（索引4）
    8'he1,  // C5（索引5）
    8'hd2,  // C6（索引6）
    8'hc3,  // C7（索引7）
    8'hb4,  // C8（索引8）
    8'ha5,  // C9（索引9）
    8'h96,  // C10（索引10）
    8'h87,  // C11（索引11）
    8'h78,  // C12（索引12）
    8'h69,  // C13（索引13）
    8'h5a,  // C14（索引14）
    8'h4b   // C15（索引15）
};

assign Sout=permu_Sout;
assign done=(i==rnd)?1:0;


always@(posedge clk or negedge rst)
begin
    if(!rst)
        now<=0;
    else
        now<=next;
end

always@(*)
begin
    if(!rst)
        next=0;
    else
    begin
        if(i<rnd)
            next=0;
        else
            next=now+1;
    end
end

always@(posedge clk or negedge rst)
begin
    if(!rst)
    begin
        i<=0;
        permu_Sin<=Sin;
        permu_const<=const[(16-rnd)*8+:8];
    end
    else
        case(now)
            0:
            begin
                permu_Sin<=permu_Sout;
                if(16-rnd+i+1<16)
                    permu_const<=const[(16-rnd+i+1)*8+:8];
                i<=i+1;
            end
        endcase
end

endmodule
